package com.lizonghui.googleplay.control;

import android.graphics.Color;
import android.view.View;
import android.view.ViewParent;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.TextView;

import com.lizonghui.googleplay.R;
import com.lizonghui.googleplay.base.BaseHolder;
import com.lizonghui.googleplay.bean.ItemInfoBean;
import com.lizonghui.googleplay.utils.LogUtils;
import com.lizonghui.googleplay.utils.UIUtils;
import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.ObjectAnimator;

import butterknife.Bind;
import butterknife.ButterKnife;

/**
 * Created by Administrator on 2016/6/25.
 * 模块化视图设计
 * 数据类型就仍是DetailInfoBean
 */
public class DetailDesHolder extends BaseHolder<ItemInfoBean> implements View.OnClickListener {

    @Bind(R.id.app_detail_des_tv_des)
    TextView mAppDetailDesTvDes;
    @Bind(R.id.app_detail_des_tv_author)
    TextView mAppDetailDesTvAuthor;
    @Bind(R.id.app_detail_des_iv_arrow)
    ImageView mAppDetailDesIvArrow;

    private boolean isOpen = true;
    private int mMeasuredHeight;
    private ItemInfoBean mInfoBean;


    //绑定数据
    @Override
    public void refreshHolderView(ItemInfoBean dataBean) {
        //拿到内容转换为成员变量，为了下面使用
        mInfoBean = dataBean;

        mAppDetailDesTvDes.setText(mInfoBean.des);
        mAppDetailDesTvDes.setTextColor(Color.BLACK);
        mAppDetailDesTvAuthor.setText(mInfoBean.author);
        mAppDetailDesTvAuthor.setTextColor(Color.BLACK);

        //为了拿到TestView高度
        //监听mAppDetailDesTvDes布局的完成
        mAppDetailDesTvDes.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                mMeasuredHeight = mAppDetailDesTvDes.getMeasuredHeight();//这里的是真正TestView的高度

                //不移除监听的话，每次当TextView改变时候，都会走到这个监听器，是的高度变化了，就不是一开始TextVeiw的高度
                mAppDetailDesTvDes.getViewTreeObserver().removeGlobalOnLayoutListener(this);//之后把监听移除
                toggleAnimation(false);//为了不看到效果，我们设置开始没有动画效果
            }
        });

        //设置默认是折叠效果，我们就手动触发它折叠。
//        toggleAnimation();//放这里不合适，因为这里和监听的onGlobalLayout()几乎同一时间执行
                          //而且这里的这里用到了测绘里面的数据
                          //测绘需要measure layout需要时间，测绘渲染完视图之后才会把回调结果拿到
                          //所以我们默认折叠放到回调中


    }

    private void toggleAnimation(boolean isAnimation) {
        if (isOpen) {
            //开始是打开，点击就折叠
            //折叠动画原理是 高度从 start-->end

            //先对控件进行测量
            mAppDetailDesTvDes.measure(0, 0);
            LogUtils.d("DetailDesHolder", "" + mMeasuredHeight);
            int start = mMeasuredHeight;//获得控件高度,设定开始值、//TestView不能直接拿到高度，会直接返回一行
            int end = getLineHeight(3,mInfoBean.des);//设定结束值

            if(isAnimation){
                doAnimation(start, end);
            }else {
                mAppDetailDesTvDes.setHeight(end);
            }


        } else {
            //开始是折叠，点击就打开
            //步骤一样 1测量 2获得开始和结束的值 3 动画执行
            mAppDetailDesTvDes.measure(0, 0);
            int start = getLineHeight(3,mInfoBean.des);
            int end = mMeasuredHeight;
            doAnimation(start, end);
        }
        isOpen = !isOpen;//最后置反
    }

    //初始化视图,找到孩子
    @Override
    public View initHolderView() {
        View rootView = View.inflate(UIUtils.getContext(), R.layout.item_detail_des, null);
        ButterKnife.bind(this, rootView);
        rootView.setOnClickListener(this);
        return rootView;
    }

    @Override
    public void onClick(View v) {
     toggleAnimation(true);
    }

    private void doAnimation(int start, int end) {
        ObjectAnimator animator = ObjectAnimator.ofInt(mAppDetailDesTvDes, "height", start, end);
        animator.start();

        //为了在展开TextView之后能够自动滚动到末尾，用户就能看到，体验好
        //监听动画的执行过程
        animator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animator) {
                //动画的开始
            }

            @Override
            public void onAnimationEnd(Animator animator) {
                //动画的结束
                //找到scrollView,然后进行滚动
                ViewParent parent = mAppDetailDesTvDes.getParent();//第一级父容器
                while (true){
                    parent = parent.getParent();
                    if(parent instanceof ScrollView){//找到了
                        ((ScrollView) parent).fullScroll(View.FOCUS_DOWN);
                        break;
                    }
                    if(parent == null){//找到最上面了
                        break;
                    }
                }
            }

            @Override
            public void onAnimationCancel(Animator animator) {
                //动画的取消
            }

            @Override
            public void onAnimationRepeat(Animator animator) {
                //动画的重复
            }
        });

        if(isOpen){
            //箭头旋转，应该用float
            ObjectAnimator.ofFloat(mAppDetailDesIvArrow, "rotation", 180, 0).start();
        }else {
            ObjectAnimator.ofFloat(mAppDetailDesIvArrow, "rotation", 0, 180).start();
        }
    }

    /**
     * 返回具体的textView应有的高度
     * @param line  行数
     * @param content 文本内容
     * @return
     */
    private int getLineHeight(int line, String content) {
        TextView tv = new TextView(UIUtils.getContext());
        tv.setText(content);
        tv.setLines(line);

        //每次想拿到控件的高度什么值，都要先测量
        tv.measure(0,0);
        int height = tv.getMeasuredHeight();
        return height;
    }

}
